﻿using System;
using System.Data;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Diagnostics;
namespace Prueba
{
    class Reporte
    {
        public static void generarReporteExcel()
        {
            String nombreTabla = "ReporteLotes";
            DateTime fecha = DateTime.Now;
            String sfecha = "";
            sfecha = Convert.ToString(fecha.ToString("yyyy.MM.dd"));
            SaveFileDialog fichero = new SaveFileDialog();

            fichero.Filter = "Excel (*.xls)|*.xls";
            fichero.FileName = nombreTabla + "." + sfecha + ".xls";

            try
            {
                //comprueba la existencia cada directorio
                if (!Directory.Exists(System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel"))
                {
                    Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel");
                }
                fichero.InitialDirectory = System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel";
                if (fichero.ShowDialog() == DialogResult.OK)
                {
                    Microsoft.Office.Interop.Excel.Application aplicacion;
                    Microsoft.Office.Interop.Excel.Workbook libro_exportacion = null;
                    Microsoft.Office.Interop.Excel.Worksheet hoja_Estado;
                    Microsoft.Office.Interop.Excel.Worksheet hoja_Humedad;
                    aplicacion = new Microsoft.Office.Interop.Excel.Application();
                    //agrega el template
                    libro_exportacion = aplicacion.Workbooks.Add(System.Windows.Forms.Application.StartupPath + @"\Reportes\Templates\ReporteLotes.xlt");
                    //agrega hoja de Estado
                    hoja_Estado =
                        (Microsoft.Office.Interop.Excel.Worksheet)libro_exportacion.Worksheets.get_Item(1);
                    //agrega hoja de Humedad
                    hoja_Humedad =
                        (Microsoft.Office.Interop.Excel.Worksheet)libro_exportacion.Worksheets.get_Item(2);

                    //Cargamos la hoja Estado
                    DataSet lotesCosechados = Estadisticas.obtenerLotesCosechados();
                    DataSet lotesSembrados = Estadisticas.obtenerLotesSembrados();

                    //Tabla Cosechados
                    for (int i = 0; i < lotesCosechados.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = lotesCosechados.Tables[0].Rows[i];
                        hoja_Estado.Cells[i + 4, 1] = campo["Lote"].ToString();
                        hoja_Estado.Cells[i + 4, 2] = campo["Estado"].ToString();
                    }
                    //Tabla Sembrados
                    for (int i = 0; i < lotesSembrados.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = lotesSembrados.Tables[0].Rows[i];
                        hoja_Estado.Cells[i + 4, 4] = campo["Lote"].ToString();
                        hoja_Estado.Cells[i + 4, 5] = campo["Estado"].ToString();
                    }
                    hoja_Estado.Cells[4, 8] = Estadisticas.obtenerCantidadLotesCosechados();
                    hoja_Estado.Cells[5, 8] = Estadisticas.obtenerCantidadLotesSembrados();


                    //Cargamos la hoja Humedades
                    DataSet humedadesSeguras = Estadisticas.obtenerLotesHumedadSegura();
                    DataSet humedadesIntermedias = Estadisticas.obtenerLoteHumedadIntermedia();
                    DataSet humedadesPeligrosas = Estadisticas.obtenerLoteHumedadPeligro();

                    //Tabla Humedades Seguras
                    for (int i = 0; i < humedadesSeguras.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesSeguras.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 1] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 2] = campo["Humedad"].ToString();
                    }
                    //Tabla Humedades Intermedias
                    for (int i = 0; i < humedadesIntermedias.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesIntermedias.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 4] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 5] = campo["Humedad"].ToString();
                    }
                    //Tabla Humedades Bajas
                    for (int i = 0; i < humedadesPeligrosas.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesPeligrosas.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 7] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 8] = campo["Humedad"].ToString();
                    }
                    //exportar Reporte
                    libro_exportacion.SaveAs(fichero.FileName,
                                             Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
                    libro_exportacion.Close(true);
                    aplicacion.Quit();
                   
                    MessageBox.Show("La exportación se realizó correctamente", "Exito", MessageBoxButtons.OK);
                }
            }
            catch (Exception)
            {

                MessageBox.Show("No se pudo realizar la exportación!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //elimina el proceso iniciado al abrir el template
                Process[] excel = Process.GetProcessesByName("EXCEL.EXE");
                excel[0].Kill();
            }

        }

        public static String generarAdjunto() 
        {
            String nombreTabla = "ReporteLotes";
            DateTime fecha = DateTime.Now;
            String sfecha = "";
            sfecha = Convert.ToString(fecha.ToString("yyyy.MM.dd"));
            String destino = System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel\" + nombreTabla + "." + sfecha + ".xls";
            try
            {
                //comprueba la existencia cada directorio
                if (!Directory.Exists(System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel"))
                {
                    Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + @"\Reportes\Excel");
                }
                //comprueba la existencia del archivo
                if (!File.Exists(destino))
                {
                    Microsoft.Office.Interop.Excel.Application aplicacion;
                    Microsoft.Office.Interop.Excel.Workbook libro_exportacion = null;
                    Microsoft.Office.Interop.Excel.Worksheet hoja_Estado;
                    Microsoft.Office.Interop.Excel.Worksheet hoja_Humedad;
                    aplicacion = new Microsoft.Office.Interop.Excel.Application();
                    //agrega el template
                    libro_exportacion = aplicacion.Workbooks.Add(System.Windows.Forms.Application.StartupPath + @"\Reportes\Templates\ReporteLotes.xlt");
                    //agrega hoja de Estado
                    hoja_Estado =
                        (Microsoft.Office.Interop.Excel.Worksheet)libro_exportacion.Worksheets.get_Item(1);
                    //agrega hoja de Humedad
                    hoja_Humedad =
                        (Microsoft.Office.Interop.Excel.Worksheet)libro_exportacion.Worksheets.get_Item(2);

                    //Cargamos la hoja Estado
                    DataSet lotesCosechados = Estadisticas.obtenerLotesCosechados();
                    DataSet lotesSembrados = Estadisticas.obtenerLotesSembrados();

                    //Tabla Cosechados
                    for (int i = 0; i < lotesCosechados.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = lotesCosechados.Tables[0].Rows[i];
                        hoja_Estado.Cells[i + 4, 1] = campo["Lote"].ToString();
                        hoja_Estado.Cells[i + 4, 2] = campo["Estado"].ToString();
                    }
                    //Tabla Sembrados
                    for (int i = 0; i < lotesSembrados.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = lotesSembrados.Tables[0].Rows[i];
                        hoja_Estado.Cells[i + 4, 4] = campo["Lote"].ToString();
                        hoja_Estado.Cells[i + 4, 5] = campo["Estado"].ToString();
                    }
                    hoja_Estado.Cells[4, 8] = Estadisticas.obtenerCantidadLotesCosechados();
                    hoja_Estado.Cells[5, 8] = Estadisticas.obtenerCantidadLotesSembrados();


                    //Cargamos la hoja Humedades
                    DataSet humedadesSeguras = Estadisticas.obtenerLotesHumedadSegura();
                    DataSet humedadesIntermedias = Estadisticas.obtenerLoteHumedadIntermedia();
                    DataSet humedadesPeligrosas = Estadisticas.obtenerLoteHumedadPeligro();

                    //Tabla Humedades Seguras
                    for (int i = 0; i < humedadesSeguras.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesSeguras.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 1] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 2] = campo["Humedad"].ToString();
                    }
                    //Tabla Humedades Intermedias
                    for (int i = 0; i < humedadesIntermedias.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesIntermedias.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 4] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 5] = campo["Humedad"].ToString();
                    }
                    //Tabla Humedades Bajas
                    for (int i = 0; i < humedadesPeligrosas.Tables[0].Rows.Count; i++)
                    {
                        DataRow campo = humedadesPeligrosas.Tables[0].Rows[i];
                        hoja_Humedad.Cells[i + 4, 7] = campo["Lote"].ToString();
                        hoja_Humedad.Cells[i + 4, 8] = campo["Humedad"].ToString();
                    }
                    //exportar Reporte
                    libro_exportacion.SaveAs(destino,
                                             Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
                    libro_exportacion.Close(true);
                    aplicacion.Quit();
                    
                    
                }    
            }
            catch (Exception)
            {
                destino = "";
                //elimina el proceso iniciado al abrir el template
                Process[] excel = Process.GetProcessesByName("EXCEL.EXE");
                excel[0].Kill();
           }

            return destino;
        }

        public static Boolean enviarReportePorMail(String para, String copia, String asunto, String contenido)
        {
            //generar mail con el reporte
            Boolean envio = true;
            
            try
            {
                    if (!verificarDatos(para, copia, contenido))
                    {
                        String ruta_archivo = generarAdjunto();
                        // crea el mail de envio usando el usuario de la persona
                        String desde = SystemInformation.UserName + "@monsanto.com";
                        if (ruta_archivo.Equals(""))
                         {
                            envio = false;
                        }else {
                        // Create the Outlook application by using inline initialization.
                        Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();

                        //Create the new message by using the simplest approach.
                        Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

                        //Add a recipient.
                        // TODO: Change the following recipient where appropriate.
                        Microsoft.Office.Interop.Outlook.Recipient oRecip = (Microsoft.Office.Interop.Outlook.Recipient)oMsg.Recipients.Add(desde);
                        oRecip.Resolve();
                        oMsg.To = para;
                        if (!copia.Trim().Equals(""))
                        {
                            oMsg.CC = copia;
                        }
                         
                        //Set the basic properties.
                        oMsg.Subject = asunto;
                        oMsg.Body = contenido;
                        //Add an attachment.
                        Microsoft.Office.Interop.Outlook.Attachment oAttach = oMsg.Attachments.Add(ruta_archivo);

                        // If you want to, display the message.
                        // oMsg.Display(true);  //modal

                        //Send the message.
                        oMsg.Save();
                        oMsg.Send();

                        //Explicitly release objects.
                        oRecip = null;
                        oAttach = null;
                        oMsg = null;
                        oApp = null;

                        }
                       }
                    else
                    {
                        envio = false;
                    }
                }
            catch (Exception)
            {

                envio = false;
            }

            return envio;
        }

        public static Boolean verificarDatos(String para, String copia, String contenido)
        {
            //verifica los datos del mail
            Boolean verifica = false;
            string expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            try
            {
                string[] destinatarios = para.Split(';');
                string[] copias = copia.Split(';');
                if (para.Equals("") || contenido.Equals(""))
                {
                    verifica = true;
                }
                else if (destinatarios.Length != 0)
                {
                    foreach (String destinatario in destinatarios)
                    {
                        if (!Regex.IsMatch(destinatario, expresion))
                        {
                            verifica = true;
                            break;
                        }
                    }
                }

                else if (copias.Length >= 1)
                {
                    foreach (String cc in copias)
                    {
                        if (!Regex.IsMatch(cc, expresion))
                        {
                            verifica = true;
                            break;
                        }
                    }
                }
            }
            catch 
            {
                verifica = true;
            }

            return verifica;
        }
        
    }
}
